From 1443876c88fbe2cb730c2987f3161c752841bf0a Mon Sep 17 00:00:00 2001 From: robertl Date: Sat, 14 Jun 2008 14:55:43 +0000 Subject: [PATCH] MTK changes from Per and Lorenzo * NMEA command handler may read back result, ie. error/status handling * Timeout during log reading will do a few retries before fatal() occurs. Please let me know if this help, (especially PPC Mac seems to have problem with large log files) * Devices with 4Mbyte memory are handled, fix 2mbyte limit as failover only * Erase will check and only enable log if previously enabled. * Log reader will check and only enable log if previously enabled. !! Let me know if these functions work as expected !! * Log bitmask/size changes are handled correct * Zero satellites in view issue' is handled * Code cleanups from Lorenzo, ... --- mtk_logger.c | 314 +++++++++++++++++++++++++++++++-------------------- 1 file changed, 194 insertions(+), 120 deletions(-) diff --git a/mtk_logger.c b/mtk_logger.c index 39428e71d..c40861b5d 100644 --- a/mtk_logger.c +++ b/mtk_logger.c @@ -169,19 +169,25 @@ struct data_item { float height; float speed; float heading; - short dsta; // differential station - float dage; // differential ... + short dsta; // differential station id + float dage; // differential data age float pdop, hdop, vdop; - char sat_used, sat_view; + char sat_used, sat_view, sat_count; short rcr; unsigned short timestamp_ms; double distance; struct sat_info sat_data[32]; } data_item; +struct mtk_loginfo { + unsigned int bitmask; + int logLen; + int period, distance, speed; /* in 10:ths of sec, m, km/h */ +} mtk_loginfo; + /* *************************************** */ -#define TIMEOUT 1000 +#define TIMEOUT 1500 #define MTK_BAUDRATE 115200 #define MTK_BAUDRATE_M241 38400 @@ -192,9 +198,7 @@ static char *erase; /* erase ? command option */ static char *csv_file; /* csv ? command option */ static int is_m241=0; -static unsigned int bmask = 0x000e0e7f; -static unsigned int mlog_period, mlog_distance, mlog_speed; /* in 10:ths of sec, m, km/h */ - +struct mtk_loginfo mtk_info; const char LIVE_CHAR[4] = {'-', '\\','|','/'}; const char TEMP_DATA_BIN[]= "data.bin"; @@ -204,12 +208,14 @@ const char CMD_LOG_DISABLE[]= "$PMTK182,5*20\r\n"; const char CMD_LOG_ENABLE[] = "$PMTK182,4*21\r\n"; const char CMD_LOG_FORMAT[] = "$PMTK182,2,2*39\r\n"; const char CMD_LOG_ERASE[] = "$PMTK182,6,1*3E\r\n"; +const char CMD_LOG_STATUS[] = "$PMTK182,2,7*3C\r\n"; - +static int mtk_log_len(unsigned int bitmask); static void mtk_rd_init(const char *fname); static void file_init(const char *fname); static void file_deinit(void) ; static void file_read(void); +static int mtk_parse_info(const unsigned char *data, int dataLen); // Arguments for logg fetch 'mtk' command.. @@ -241,7 +247,8 @@ static int do_send_cmd(const char *cmd, int cmdLen) { return cmdLen; } -static int do_cmd(const char *cmd, const char *expect, time_t timeout_sec) { + +static int do_cmd(const char *cmd, const char *expect, char **rslt, time_t timeout_sec) { char line[256]; int len, done, loops, cmd_erase; int expect_len; @@ -296,6 +303,15 @@ static int do_cmd(const char *cmd, const char *expect, time_t timeout_sec) { if ( expect_len > 0 && strncmp(&line[1], expect, expect_len) == 0 ){ if ( cmd_erase && global_opts.debug_level > 0 ) printf("\n"); dbg(6, "NMEA command success !\n"); + if ( (len - 4) > expect_len ){ // alloc and copy data segment... + if ( line[len-3] == '*' ) + line[len-3] = '\0'; + // printf("Data segment: #%s#\n", &line[expect_len+1]); + if ( rslt ){ + *rslt = xmalloc(len-3-expect_len+1); + strcpy(*rslt, &line[expect_len+1]); + } + } done = 1; } else if ( strncmp(line, "$PMTK", 5) == 0 ){ /* A quick parser for ACK packets */ @@ -358,11 +374,11 @@ static void mtk_rd_init(const char *fname){ fatal(MYNAME ": Failed to set baudrate !\n"); } - rc = do_cmd("$PMTK605*31\r\n", "PMTK705", 10); + rc = do_cmd("$PMTK605*31\r\n", "PMTK705", NULL, 10); if ( rc != 0 ) fatal(MYNAME ": This is not a MTK based GPS ! (or is it turned off ?)\n"); -} + } static void mtk_rd_deinit(void){ dbg(3, "Closing port...\n"); @@ -371,21 +387,40 @@ static void mtk_rd_deinit(void){ xfree(port); } -int mtk_erase(void){ +static int mtk_erase(void){ + int log_status, log_mask, err; + char *lstatus = NULL; + + log_status = 0; + // check log status - is logging disabled ? + do_cmd(CMD_LOG_STATUS, "PMTK182,3,7,", &lstatus, 2); + if ( lstatus ){ + log_status = atoi(lstatus); + dbg(3, "LOG Status '%s'\n", lstatus); + xfree(lstatus); + lstatus = NULL; + } + + do_cmd(CMD_LOG_FORMAT, "PMTK182,3,2,", &lstatus, 2); + if ( lstatus ){ + log_mask = strtoul(lstatus, NULL, 16); + dbg(3, "LOG Mask '%s' - 0x%.8x \n", lstatus, log_mask); + xfree(lstatus); + lstatus = NULL; + } dbg(1, "Start flash erase..\n"); - do_cmd(CMD_LOG_DISABLE, "PMTK001,182,5,3", 1); - gb_sleep(10*1000); - - do_cmd(CMD_LOG_FORMAT, "PMTK182,3,2", 2); + do_cmd(CMD_LOG_DISABLE, "PMTK001,182,5,3", NULL, 1); gb_sleep(10*1000); // Erase log.... - do_cmd(CMD_LOG_ERASE, "PMTK001,182,6", 30); + do_cmd(CMD_LOG_ERASE, "PMTK001,182,6", NULL, 30); gb_sleep(100*1000); - do_cmd(CMD_LOG_ENABLE, "PMTK001,182,4,3", 2); - + if ( (log_status & 2) ){ // auto-log were enabled before..re-enable log. + err = do_cmd(CMD_LOG_ENABLE, "PMTK001,182,4,3", NULL, 2); + dbg(3, "re-enable log %s\n", err==0?"Success":"Fail"); + } return 0; } @@ -393,10 +428,13 @@ static void mtk_read(void){ char cmd[256]; char *line = NULL; unsigned char crc, *data = NULL; - int cmdLen, j, bsize, i, len, ff_len, rc, init_scan; + int cmdLen, j, bsize, i, len, ff_len, rc, init_scan, retry_cnt, log_enabled; unsigned int line_size, data_size, data_addr, addr, addr_max; FILE *dout; + char *fusage = NULL; + log_enabled = 0; + init_scan = 0; dout = fopen(TEMP_DATA_BIN, "wb"); if ( dout == NULL ){ fatal(MYNAME ": Can't create temporary file %s", TEMP_DATA_BIN); @@ -404,11 +442,36 @@ static void mtk_read(void){ } dbg(1, "Download %s -> %s\n", port, TEMP_DATA_BIN); - i = do_cmd(CMD_LOG_DISABLE, "PMTK001,182,5,3", 2); - dbg(3, " ---- LOG DISABLE ---- %s\n", i==0?"Success":"Fail"); - - addr_max = 0x200000-64*1024; // 16Mbit/2Mbyte/32x64kByte block. - init_scan = 1; + // check log status - is logging disabled ? + do_cmd(CMD_LOG_STATUS, "PMTK182,3,7,", &fusage, 2); + if ( fusage ){ + log_enabled = (atoi(fusage) & 2)?1:0; + dbg(3, "LOG Status '%s' -- log %s \n", fusage, log_enabled?"enabled":"disabled"); + xfree(fusage); + fusage = NULL; + } + + gb_sleep(10*1000); + if ( 1 || log_enabled ){ + i = do_cmd(CMD_LOG_DISABLE, "PMTK001,182,5,3", NULL, 2); + dbg(3, " ---- LOG DISABLE ---- %s\n", i==0?"Success":"Fail"); + } + gb_sleep(100*1000); + + addr_max = 0; + // get flash usage, current log address..cmd only works if log disabled. + do_cmd("$PMTK182,2,8*33\r\n", "PMTK182,3,8,", &fusage, 2); + if ( fusage ){ + addr_max = strtoul(fusage, NULL, 16); + if ( addr_max > 0 ) + addr_max = addr_max - addr_max%65536 + 65535; + xfree(fusage); + } + + if ( addr_max == 0 ) { // get flash usage failed... + addr_max = 0x200000-64*1024; // 16Mbit/2Mbyte/32x64kByte block. -- fixme Q1000-ng has 32Mbit + init_scan = 1; + } bsize = 0x0400; addr = 0x0000; @@ -422,7 +485,7 @@ static void mtk_read(void){ } memset(line, '\0', line_size); memset(data, '\0', data_size); - + retry_cnt = 0; while ( init_scan || addr < addr_max ) { // generate - read address NMEA command, add crc. @@ -432,13 +495,19 @@ static void mtk_read(void){ crc ^= cmd[i]; cmdLen += snprintf(&cmd[cmdLen], sizeof(cmd)-cmdLen, "*%.2X\r\n", crc); +mtk_retry: do_send_cmd(cmd, cmdLen); memset(line, '\0', line_size); do { rc = gbser_read_line(fd, line, line_size-1, TIMEOUT, 0x0A, 0x0D); if ( rc != gbser_OK) { - fatal(MYNAME "mtk_read(): Read error (%d)\n", rc); + if ( rc == gbser_TIMEOUT && retry_cnt < 3 ){ + dbg(2, "\nRetry %d at 0x%.8x\n", retry_cnt, addr); + retry_cnt++; + goto mtk_retry; + } // else + fatal(MYNAME "mtk_read(): Read error (%d)\n", rc); } len = strlen(line); dbg(8, "Read %d bytes: '%s'\n", len, line); @@ -446,6 +515,7 @@ static void mtk_read(void){ if ( len > 0 ) { line[len] = '\0'; if ( strncmp(line, "$PMTK182,8", 10) == 0 ){// $PMTK182,8,00005000,FFFFFFF + retry_cnt = 0; data_addr = strtoul(&line[11], NULL, 16); fseek(dout, data_addr, SEEK_SET); i = 20; @@ -498,9 +568,12 @@ static void mtk_read(void){ fclose(dout); dbg(2, "\n"); - i = do_cmd(CMD_LOG_ENABLE, "PMTK001,182,4,3", 2); - dbg(3, " ---- LOG ENABLE ----%s\n", i==0?"Success":"Fail"); - + if ( log_enabled ){ + i = do_cmd(CMD_LOG_ENABLE, "PMTK001,182,4,3", NULL, 2); + dbg(3, " ---- LOG ENABLE ----%s\n", i==0?"Success":"Fail"); + } else { + dbg(1, "Note !!! -- Logging is DISABLED !\n"); + } if ( line != NULL ) xfree(line); if ( data != NULL ) @@ -527,7 +600,7 @@ static int add_trackpoint(int idx, unsigned long bmask, struct data_item *itm){ if ( global_opts.masked_objective & TRKDATAMASK && trk_head == NULL ){ trk_head = route_head_alloc(); xasprintf(&trk_head->rte_desc, "Log every %.0f sec, %.0f m, %.0f km/h" - , mlog_period/10., mlog_distance/10., mlog_speed/10.); + , mtk_info.period/10., mtk_info.distance/10., mtk_info.speed/10.); track_add_head(trk_head); } @@ -628,7 +701,7 @@ static void mtk_csv_init(char *csv_fname, unsigned long bitmask){ gbfprintf(cd, "INDEX,%s%s", ((1<sat_data[l].id > 0 ){ - slen = 0; - slen += sprintf(&sstr[slen], "%s%.2d" - , itm->sat_data[l].used?"#":"" - , itm->sat_data[l].id); - if ( bmask & (1<sat_data[l].elevation); - if ( bmask & (1<sat_data[l].azimut); - if ( bmask & (1<sat_data[l].snr); - - gbfprintf(csvFile, "%s%s" , do_sc?";":"", sstr); - do_sc = 1; - } + for (l=0;lsat_count;l++){ + slen = 0; + slen += sprintf(&sstr[slen], "%s%.2d" + , itm->sat_data[l].used?"#":"" + , itm->sat_data[l].id); + if ( bmask & (1<sat_data[l].elevation); + if ( bmask & (1<sat_data[l].azimut); + if ( bmask & (1<sat_data[l].snr); + + gbfprintf(csvFile, "%s%s" , do_sc?";":"", sstr); + do_sc = 1; } gbfprintf(csvFile, ","); } @@ -830,50 +901,45 @@ int mtk_parse(unsigned char *data, int dataLen, unsigned int bmask){ break; case 1< 0 ) - sat_count = le_read16(data + i + 2); + int sat_count, sat_idx, sid_size, l; + + sat_count = le_read16(data + i + 2); if ( sat_count > 32 ) sat_count = 32; // this can't happen ? or... - - sid_size = log_type[SID].size; - if ( bmask & (1< 0 ){ // handle 'Zero satellites in view issue' + if ( bmask & (1< 0 ){ + do { sat_id = data[i]; itm.sat_data[sat_idx].id = sat_id; itm.sat_data[sat_idx].used = data[i + 1]; // get_word(&data[i+2], &smask); // assume - nr of satellites... - - if ( bmask & (1< 0 ){ + if ( bmask & (1< 0 ) */ + } while ( sat_count > 0 ); } continue; // dont do any more checksum calc.. break; @@ -903,20 +969,19 @@ int mtk_parse(unsigned char *data, int dataLen, unsigned int bmask){ } } /* for (bmap,...) */ - if ( ! is_m241 && ( data[i] != '*') ) { - if ( global_opts.debug_level > 0 ) { - int j; - printf("Missing '*' !\n"); - for(j=0;j %.8x ###########\n", bmask, bm); - bmask = bm; + if ( mtk_info.bitmask != bm ) + dbg(1," ########## Bitmask Change %.8x -> %.8x ###########\n", mtk_info.bitmask, bm); + mtk_info.bitmask = bm; + mtk_info.logLen = mtk_log_len(mtk_info.bitmask); break; case 0x03: dbg(1, "# Log period change %.0f sec\n", cmd/10.); - mlog_period = cmd; + mtk_info.period = cmd; break; case 0x04: dbg(1, "# Log distance change %.1f m\n", cmd/10.); - mlog_distance = cmd; + mtk_info.distance = cmd; break; case 0x05: dbg(1, "# Log speed change %.1f km/h\n", cmd/10.); - mlog_speed = cmd; + mtk_info.speed = cmd; break; case 0x06: dbg(1, "# Log policy change 0x%.4x\n", cmd); @@ -996,6 +1062,23 @@ static int mtk_parse_info(const unsigned char *data, int dataLen){ return 16; } +static int mtk_log_len(unsigned int bitmask){ + int i, len; + + /* calculate the length of a binary log item. */ + len = 2; // add '*' + crc, holux would only be +1, oh, well... + for (i=0;i<32;i++){ + if ( (1< 0 ){ bLen += j; i = 0; - while ( (bLen - i) >= logLen ){ + while ( (bLen - i) >= mtk_info.logLen ){ k = 0; if ( (bLen - i) >= 16 && memcmp(&buf[i], &LOG_RST[0], 6) == 0 && memcmp(&buf[i+12], &LOG_RST[12], 4) == 0 ) @@ -1136,7 +1210,7 @@ static void file_read(void) { { /* End of 64k block segment -- realign to next data area */ - k = ((pos+logLen+1024)/0x10000) *0x10000 + 0x200; + k = ((pos+mtk_info.logLen+1024)/0x10000) *0x10000 + 0x200; i = sizeof(buf); if ( k <= pos ) { k += 0x10000; @@ -1152,7 +1226,7 @@ static void file_read(void) { pos = k; continue; } else { - k = mtk_parse(&buf[i], logLen, bmask); + k = mtk_parse(&buf[i], mtk_info.logLen, mtk_info.bitmask); } i += k; -- 2.30.2